// Copyright 2009 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

#include "runtime_types.h"
#include "mem_alloc.h"
#include "type.h"
#include "interface.h"
#include "panic.h"

// Implement unsafe_NewArray, called from the reflect package.

void *unsafe_NewArray(struct __go_empty_interface type, int n) __asm__("reflect.unsafe_NewArray");

// The dynamic type of the argument will be a pointer to a type descriptor.

void *
unsafe_NewArray(struct __go_empty_interface type, int n)
{
	const struct __go_type_descriptor *descriptor;

	if (((uintptr) type.__type_descriptor & reflectFlags) != 0)
		runtime_panicstring("invalid interface value");

	// FIXME: We should check __type_descriptor to verify that this is really a type descriptor.
	descriptor = (const struct __go_type_descriptor *)type.__object;
	return runtime_malloc(descriptor->__size * n);
}
